package org.ejb.entities;

import javax.persistence.*;

import org.ejb.api.*;

import java.io.Serializable;
import java.util.*;

/**
 * Cette classe represente une evaluation (commentaire et note) pour un produit donne
 *
 */

@SuppressWarnings("serial")
@Entity
public class Evaluation implements Serializable{
	
	// ======================================
	// =             Attributs              =
	// ======================================
	
	/** L'identifiant du commentaire */
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO)
	private Long id;
	
	/** Le titre du commentaire */
	private String title;
	
	/** Le commentaire */
	private String content;
	
	/** La note affectee au produit */
	private Integer userRate;
	
	/** La date du commentaire */
	//private Date dateOfComment;
	
    @ManyToOne
    private Item item;
    
//    @ManyToOne(fetch = FetchType.EAGER)
//    @JoinColumn(name = "utilisateur_fk", nullable = false)
//    private Utilisateur utilisateur;


	// ======================================
    // =            Constructeurs           =
    // ======================================
    public Evaluation() {
    }

    public Evaluation(String title, String content) {
        this.content = content;
        this.title = title;
    }
    
    
    // ======================================
    // =     Methodes Lifecycle Callback    =
    // ======================================
//    @SuppressWarnings("unused")
//	@PrePersist
//    private void setDefaultData() {
//    	dateOfComment = new Date();
//    }    
    
    // ======================================
    // =             Accesseurs             =
    // ======================================
    
	/** @return the title */
	public String getTitle() {
		return title;
	}
	/** @param title the title to set */
	public void setTitle(String title) {
		this.title = title;
	}

	/** @return the content */
	public String getContent() {
		return content;
	}
	/** @param content the content to set */
	public void setContent(String content) {
		this.content = content;
	}

	/** @return the userRate */
	public Integer getUserRate() {
		return userRate;
	}
	/** @param userRate the userRate to set */
	public void setUserRate(Integer userRate) {
		this.userRate = userRate;
	}
 

	/** @return the id */
	public Long getId() {
		return id;
	}
	public void setId(Long id){
		this.id = id;
	}
	
//	/** @return the dateOfComment */
//	public Date getDateOfComment() {
//		return dateOfComment;
//	}
//	public void setDateOfComment(Date dateOfComment) {
//		this.dateOfComment = dateOfComment;
//	}
	
	/** @return the Item */
	public Item getItem() {
		return item;
	}
	public void setItem(Item item) {
		this.item = item;
		item.getEvals().add(this);
	}

//	public Utilisateur getUtilisateur() {
//		return utilisateur;
//	}
//	public void setUtilisateur(Utilisateur utilisateur) {
//		this.utilisateur = utilisateur;
//	}

	


    
	// ======================================
    // =   Methodes hash, equals, toString  =
    // ======================================
	
	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		Evaluation eval = (Evaluation) o;
		if (!title.equals(eval.title)) return false;
		if (!content.equals(eval.content)) return false;
		if (!id.equals(eval.id)) return false;
		if (!(userRate == eval.userRate)) return false;

		return true;
	}

	@Override
	public int hashCode() {
		int result;
		result = id.hashCode();
		result = 31 * result + userRate.hashCode();
		result = 31 * result + title.hashCode();
		result = 31 * result + content.hashCode();
		return result;
	}
	
	@Override
	public String toString() {
		final StringBuilder sb = new StringBuilder();
		sb.append("Evaluation");
		sb.append("{id=").append(id);
		sb.append(", title='").append(title).append('\'');
		sb.append(", content='").append(content).append('\'');
		sb.append(", userRate='").append(userRate).append('\'');
		//sb.append(", dateOfComment='").append(dateOfComment).append('\'');
		sb.append('}');
		return sb.toString();
	}
    
	
}

